'''
使用逻辑斯蒂回归 和 随机参数估计回归 对良恶性肿瘤进行预测
线性分类器
 最基本和常用的机器学习模型
 受限于数据特征与分类目标的线性假设
 逻辑斯蒂回归 计算时间长，模型性能略高
 随机参数估计 计算时间短，模型性能略低


如果是连续的，就是多重线性回归；
如果是二项分布，就是Logistic回归；
如果是Poisson分布，就是Poisson回归；
如果是负二项分布，就是负二项回归。

from sklearn.ensemble import ExtraTreesClassifier 决策树
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
clf=tree.DecisionTreeClassifier(criterion='entropy',max_depth=7)
clf.fit(x_train,y_train)
 '''
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import  LogisticRegression, SGDClassifier
from sklearn.metrics import classification_report

column_names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell size','Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']
f = open('c:/文档文件/MachineLearning-master/data/breast/breast-cancer-wisconsin.data')#含有中文的解决办法
data = pd.read_csv(f, names=column_names)
data=data.replace(to_replace='?',value=np.nan)# 将?替换为标准缺失值表示
data=data.dropna(how='any')# 丢失带有缺失值的数据 只要有一个维度有缺失就丢弃
'''
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)
train_data：被划分的样本特征集
train_target：被划分的样本标签
test_size：如果是浮点数，在0-1之间，表示样本占比；如果是整数的话就是样本的数量
random_state：是随机数的种子。
随机数种子：其实就是该组随机数的编号，在需要重复试验的时候，保证得到一组一样的随机数。比如你每次都填1，其他参数一样的情况下你得到的随机数组是一样的。但填0或不填，每次都会不一样。
随机数的产生取决于种子，随机数和种子之间的关系遵从以下两个规则：
种子不同，产生不同的随机数；种子相同，即使实例不同也产生相同的随机数。


data = data.as_matrix() #将表格转换为矩阵
'''
x_train, x_test, y_train, y_test =train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.3, random_state=0)
#print(y_train.value_counts())
# 数据标准化，保证每个维度特征的方差为1 均值为0 预测结果不会被某些维度过大的特征值主导
ss = StandardScaler()#去均值和方差归一化。且是针对每一个特征维度来做的，而不是针对样本。
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test) # 用与x_train相同的规则对x_test进行标准化，不重新建立规则

# 分别使用 逻辑斯蒂回归 和 随机参数估计 两种方法进行学习预测
lr = LogisticRegression()   # 初始化逻辑斯蒂回归模型
sgdc = SGDClassifier()  # 初始化随机参数估计模型

lr.fit(x_train, y_train)#训练
lr_y_predict = lr.predict(x_test)#训练结束，预测
#print (x_test)
#print(y_test)

sgdc.fit(x_train, y_train)
sgdc_y_predict = sgdc.predict(x_test)

print("逻辑斯蒂回归准确率：", lr.score(x_test, y_test))
print("逻辑斯蒂回归的其他指标：\n", classification_report(y_test, lr_y_predict, target_names=["Benign", "Malignant"]))#良性、恶性

# 随机参数估计的性能分析
'''
recall 召回率
precision 精确率
fl-score
support
 '''
print("随机参数估计准确率：", sgdc.score(x_test, y_test))
# 随机参数估计的其他指标
print("随机参数估计的其他指标:\n", classification_report(y_test, sgdc_y_predict, target_names=["Benign", "Malignant"]))